package u2

import (
	"reflect"
	"strings"
)

// SliceHas 检查字符串切片中是否包含指定的字符串
//
// 参数：
//
//	slice - 要搜索的字符串切片
//	key - 要查找的字符串
//	ignoreAa - 是否忽略大小写
//
// 返回值：
//
//	bool - 如果找到匹配项返回true，否则返回false
//
// 注意：
//
//	当ignoreAa为true时，使用不区分大小写的比较
//
// 示例：
//
//	list := []string{"apple", "Banana", "Orange"}
//	found := SliceHas(list, "banana", true) // 返回true
func SliceHas(slice []string, key string, ignoreAa bool) bool {
	for _, val := range slice {
		if ignoreAa {
			if strings.EqualFold(val, key) {
				return true
			}
		} else {
			if val == key {
				return true
			}
		}

	}
	return false
}

// SliceContains 检查字符串切片中是否包含指定子字符串
//
// 参数：
//
//	slice - 要搜索的字符串切片
//	key - 要查找的子字符串
//	ignoreAa - 是否忽略大小写
//
// 返回值：
//
//	bool - 如果找到包含子字符串的项返回true，否则返回false
//
// 注意：
//
//	当ignoreAa为true时，使用不区分大小写的比较
//
// 示例：
//
//	list := []string{"apple pie", "Banana bread", "Orange juice"}
//	found := SliceContains(list, "BANANA", true) // 返回true
func SliceContains(slice []string, key string, ignoreAa bool) bool {
	for _, val := range slice {
		if ignoreAa {
			if strings.Contains(strings.ToUpper(val), strings.ToUpper(key)) {
				return true
			}
		} else {
			if strings.Contains(val, key) {
				return true
			}
		}

	}
	return false
}

// SliceBeContains 检查字符串是否包含切片中的任何值
//
// 参数：
//
//	key - 要搜索的字符串
//	slice - 包含要查找的字符串的切片
//	ignoreAa - 是否忽略大小写
//
// 返回值：
//
//	bool - 如果字符串包含切片中的任何值返回true，否则返回false
//
// 注意：
//
//	当ignoreAa为true时，使用不区分大小写的比较
//
// 示例：
//
//	list := []string{"apple", "banana", "orange"}
//	found := SliceBeContains("I like banana", list, true) // 返回true
func SliceBeContains(key string, slice []string, ignoreAa bool) bool {
	for _, val := range slice {
		if ignoreAa {
			if strings.Contains(strings.ToUpper(key), strings.ToUpper(val)) {
				return true
			}
		} else {
			if strings.Contains(key, val) {
				return true
			}
		}

	}
	return false
}

// Interface2InterfaceSlice 将任意类型的切片转换为[]interface{}类型
//
// 参数：
//
//	slice - 要转换的任意类型切片
//
// 返回值：
//
//	[]interface{} - 转换后的切片
//
// 注意：
//
//	如果输入不是切片类型，返回空切片
//
// 示例：
//
//	intSlice := []int{1, 2, 3}
//	result := Interface2InterfaceSlice(intSlice) // 返回[]interface{}{1, 2, 3}
func Interface2InterfaceSlice(slice interface{}) []interface{} {
	s := reflect.ValueOf(slice)
	if s.Kind() != reflect.Slice {
		return []interface{}{}
	}
	ret := make([]interface{}, s.Len())
	for i := 0; i < s.Len(); i++ {
		ret[i] = s.Index(i).Interface()
	}
	return ret
}

// GetNoRepeatList 获取去重后的字符串切片
//
// 参数：
//
//	list - 要处理的字符串切片
//	removeEmpty - 是否移除空字符串
//
// 返回值：
//
//	[]string - 去重后的字符串切片
//
// 注意：
//  1. 使用map实现去重，不保证顺序
//  2. 当removeEmpty为true时，会移除所有空字符串
//
// 示例：
//
//	list := []string{"apple", "banana", "apple", "", "Banana"}
//	result := GetNoRepeatList(list, true) // 返回["apple", "banana", "Banana"]
func GetNoRepeatList(list []string, removeEmpty bool) []string {
	var result []string
	tmpMap := make(map[string]bool)
	for i := 0; i < len(list); i++ {
		if _, ok := tmpMap[list[i]]; !ok {
			if removeEmpty && list[i] == "" {
				continue
			}
			tmpMap[list[i]] = true
			result = append(result, list[i])
		}
	}
	return result
}
